#include <M5Stack.h>
#include "luobotou2.h"
#include "luobotou.h"
#include "M5UnitENV.h"
#include <Arduino.h>
#include <string.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <FS.h>
#include <Adafruit_I2CDevice.h>
#include <SPIFFS.h>
#include <SD.h>
#include <Adafruit_NeoPixel.h>
#include "AudioFileSourceID3.h"
#include "AudioFileSourceSD.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
#include "CUF_24px.h"

#include <IRsend.h>
#include <Wire.h>
#include <IRremoteESP8266.h>
// #include <ir_Coolix.h>
// #include<ir_Bosch.cpp>
#include "IRMeidi.h"
//串口
#include <HardwareSerial.h>
HardwareSerial MySerial_stm32(1);  
char control_mode[100];
const char* status;

const uint16_t kIrLed = 26;  
IRsendMeidi irsendmeidi(kIrLed); // 声明类对象
int FAN_GPIO = 22;

void OPEN_FAN()
{
  digitalWrite(FAN_GPIO,LOW);//引脚低电平打开风扇
}

void CLOSE_FAN()
{
  digitalWrite(FAN_GPIO,HIGH);//引脚高电平关闭风扇
}

void read_usart() {
    size_t dataAvailable = MySerial_stm32.available();  // 获取可用数据量
    if (dataAvailable > 0) {
        char inputBuffer[dataAvailable]; 
        MySerial_stm32.read(inputBuffer, dataAvailable);  // 一次性读取所有数据到缓冲区

        std::string cleanData;
        for (size_t j = 0; j < dataAvailable; j++) {
            if (inputBuffer[j] == '2' && inputBuffer[j + 1] == '1' && inputBuffer[j + 2] ==' '&& inputBuffer[j + 3] == 'e' && inputBuffer[j + 4] == 'n' && inputBuffer[j + 5] == 'd') { // 判断是否为特定字符串
                cleanData += "21 end";
                break;
            }
        }

         char tempControlMode[dataAvailable];  // 临时数组
        strcpy(tempControlMode, cleanData.c_str());
        strcpy(control_mode, tempControlMode);

        Serial.print("control_mode 接收到的数据为:");
        Serial.print(control_mode);
        Serial.println("");

    } else {
        Serial.println("串口接收区没有数据");
    }
}

void setup()
{
  irsendmeidi.begin_2();                                     // 初始化
  
  Serial.begin(115200);
  MySerial_stm32.begin(115200, SERIAL_8N1, 16, 17);          //串口初始化
  pinMode(FAN_GPIO,OUTPUT);
  CLOSE_FAN();
  M5.begin();
  // M5.Power.begin();        
  M5.Lcd.setRotation(1);
  M5.Lcd.drawBitmap(0, 0, 320, 240, gImage_spark5);
  M5.Lcd.setFreeFont(
        &unicode_24px);  // Set the GFX font to use.  设置要使用的GFX字体
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(35, 110);
  M5.Lcd.print("空调控制模块");
}

void loop()
{
  read_usart();
  if(strcmp(control_mode, "21 end") == 0)//判断接收到的数据是否符合条件
  {
   irsendmeidi.setTemps(26); // 设置温度为26度
   OPEN_FAN();//打开风扇
   delay(2000);
   CLOSE_FAN();//关闭风扇S
   delay(2000);
   memset(control_mode, 0, sizeof(control_mode));
   status="success";
   MySerial_stm32.write(status, strlen(status));//串口反馈执行操作状态
  }
  delay(1000);

  //  delay(5000);
  // irsendmeidi.setPowers(1); // 打开空调
  // delay(5000);
  // irsendmeidi.setModes(1); // 设置为制冷模式
  // delay(5000);
  // irsendmeidi.setTimers(2); // 定时2小时

  // delay(5000);
  // irsendmeidi.setTimers(9.5); // 定时9.5小时
  // delay(5000);
  // irsendmeidi.setFanSpeeds(5); // 设置风速为100%
  // delay(5000);
  // irsendmeidi.setFanSpeeds(1); // 设置风速为20%
  // delay(5000);
  // irsendmeidi.setEco(1); // 打开ECO
  // delay(5000);
  // irsendmeidi.setEco(0); // 关闭ECO
  // delay(5000);
  // irsendmeidi.setTemps(26.5); // 设置温度为26.5度
  // delay(5000);
  // irsendmeidi.setSwingUD(1); // 打开上下扫风
  // delay(5000);
  // irsendmeidi.setFZC(1); // 打开防直吹模式
  // irsendmeidi.setPowers(0); // 关闭空调
  // delay(10000);
}